web 無遠弗屆可以接觸到世界各地的人們,因此網站的內容必須要準備多種語言供應不同的 user 讓大家知道我們正在解決什麼問題,所以最後一天就來看看 Vue 怎麼套用多語系(i18n)吧。
internationalization
在 i
~~ n
中間有18
個字母,因此常以 i18n
代替說明。
我們使用 vue-i18n 套件 | vue-i18n documentation
npm install vue-i18n --save-dev
所有的語言包會放在 i18n folder 下,新增兩隻 JSON ( en.json, tw.json )
└─src
└─i18n
├─en.json
└─tw.json
利用 JSON 儲存兩種語言的翻譯檔案。
key | value |
---|---|
template 使用字串對應 | 翻譯內容 |
// tw.json
{
"Please_sign_in": "請登入。",
"Email_address": "輸入電子郵件",
"Password": "輸入密碼",
"Show_password": "顯示密碼",
"Sign_in": "登入"
}
// en.json
{
"Please_sign_in": "Please sign in",
"Email_address": "Email address",
"Password": "Password",
"Show_password": "Show Password",
"Sign_in": "Sign in"
}
import VueI18n from 'vue-i18n';
// init
Vue.use( VueRouter );
Vue.use( VueI18n );
// i18n
import en from './i18n/en.json'; // 存放英文翻譯
import tw from './i18n/tw.json'; // 存放繁體中文翻譯
const locales = {
en: en,
tw: tw,
};
// set lang from state
// lang 對應的是 locales 的 key 目前有:en, tw
Vue.config.lang = store.state.lang; // 從 state 獲取預設語言設定。
// set locales
Object.keys(locales).forEach(function (lang) {
Vue.locale(lang, locales[lang]);
});
語系 state 也是設計在 root 上,因為整個系統的語系是統一的設定。
store/root.js
只列出修改的
import * as types from './mutations_types.js';
// 為了設定語系引入 Vue
import Vue from 'vue';
export const state = {
lang: 'en',
}
export const actions = {
setLanguage ({ commit }, lang) {
commit(types.LANGUAGE, lang);
},
}
export const mutations = {
[types.LANGUAGE] (state, setlang) {
state.lang = setlang;
// 設定 Vue config 將會改變 i18n 使用的語言包而更改語系!
Vue.config.lang = state.lang;
},
}
在 template 的使用上要改成:$t(
key字串 )
以 login 頁面範例。
<!-- 在 tag 內容,外面一樣使用 {{ }} -->
<h2>{{ $t("Please_sign_in") }}</h2>
<!-- 在 attribute 上使用 -->
:placeholder="$t('Email_address')"
<!-- 記得使用 v-bind: 不然不會更新 -->
在 switch 按鈕使用 @change 發出 action: setLanguage
然後用比較偷懶的方法,bind true & false value 分別是 tw, en 傳給 action
直接帶到 mutation set lang
<template>
<input
type="checkbox"
v-model="lang"
:true-value="'tw'"
:false-value="'en'"
@change="setLanguage( lang )"
id="slideThree" />
<label for="slideThree"></label>
</template>
<script>
export default {
data () {
return {
lang: this.$store.state.lang, // get lang 預設值 `en`
}
},
}
</script>
以上
在 vue-i18n 與 vuex 搭配上,目前想到這個方法,
如果有更好的方式或流程在提出來討論囉。
其中
Weex
感覺是可以追蹤的項目: Vue x 阿里巴巴 合作
React 有 React Native
Vue 有 Weex
有看到再補..
在 2016 年最後一天,完成了三十天連續發文的鐵人賽,
是今年參加最有意義的活動之一。
參賽前還在猶豫沒有把握可以完賽,
感謝 卡斯伯 推坑。
從第一週每天趕在 11: 59 以前發出文章,
到中期每天都在思考我今天有發文了嗎?
就這樣.. 跌跌撞撞的走完三十天 :D
感謝 ithome ithelp 舉辦 ironman 活動。
感謝 HackMD 跨平台 markdown 服務,用瀏覽器就可以寫作,所有文章都是在這邊撰寫的。
感謝公司主管與同事,默默支持。
最後祝大家新年快樂,身體健康,專案順心。
Just Do It !
實作小範例入門 Vue & Vuex 2.0 - github 完整範例
使用 git checkout 切換每天範例。
你好 請問一下 store/root.js 路徑在哪裡呢
或者大大有 DEMO 可否參考?
Hi 你好,歡迎下載 github 在每篇文章後面,並使用 checkout 切換每天的紀錄
感謝大大~受益了
在想請教~ 我切換語言版本後,如若刷新 則回到原先預設語言,可有方法讓他維持著切換當下版本呢?
我猜可以記到 sessionStorage
或 localStorage
init 的時候先去抓吧
依照您所做 我已經可以切換了。
但想更進一步的用get出來的數據庫資料,也能做語言上的切換該如何做呢?
vue-i18n 可以帶變數進去,相當於一段文字,挖掉幾個位子讓你帶參數進去組合:https://kazupon.github.io/vue-i18n/formatting.html
大大, 我想請問我該如何開啟您在git上的檔案? (.vue)
只看到結果 ~"~?
一般文字編輯器,或開發工具皆可如: Sublime Text, VS Code, Notepad++ 等..
另外關於 .vue
檔案是什麼,在先前文章有簡易介紹。
sorry大大 我的意思是 git下載下來的檔案(.vue) 用編譯器開起來是沒問題的. 發怖出去是只有html檔才能打開, 我該如何把您的範例(.vue)轉成html檔案然後在網頁上顯示出來?
vue-cli 內建 build code 程式腳本,試試看:
npm run build
可是一直出現錯誤 ~"~
"bind is not a function"
build
?